package com.bestcem.xm.txtanls.dao;

import com.bestcem.xm.txtanls.dao.dto.PageDTO;
import com.bestcem.xm.txtanls.dao.dto.RecordSentiDTO;
import com.bestcem.xm.txtanls.entity.pojo.RecordDO;
import com.bestcem.xm.txtanls.service.dto.RecordSearchDTO;
import com.bestcem.xm.txtanls.service.dto.record.PageRecordDTO;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;

/**
 * 原话记录表DAO
 *
 * @author liheng
 * @version v1.0
 * @date 2021/5/10-16:49
 */
public interface RecordDao {

    /**
     * 根据DTO参数查询原话记录Id
     *
     * @param recordSearchDTO 原话记录查询DTO
     * @return List<RecordEntity> 原话记录列表
     **/
    List<String> listRecordIds(RecordSearchDTO recordSearchDTO);


    /**
     * 统计原话记录数
     *
     * @param recordSearchDTO 查询条件
     * @return 原话记录数
     * @see RecordSearchDTO
     */
    Long countRecord(RecordSearchDTO recordSearchDTO);


//    /**
//     * 查询关键词关联原话数量
//     *
//     * @param recordSearchDTO 查询条件
//     * @param regex           原话模糊匹配串
//     * @return 关联原话数量
//     * @author liheng
//     * @see RecordSearchDTO
//     */
//    Long countRecordWithRegex(RecordSearchDTO recordSearchDTO, String regex);


    /**
     * 原话记录保存
     *
     * @param recordDOEntity 需保存的原话记录
     * @author gy.liu
     * @date 2021/5/14
     */
    RecordDO insertRecord(RecordDO recordDOEntity);

    /**
     * 查询原话对应的情感，并对其结果进行聚合处理
     *
     * @param recordSearchDTO 原话查询参数
     * @return List<String>
     * @author jy.zhao
     * @date 2021/5/14 13:32
     **/
    List<RecordSentiDTO> listRecordSentisGroupBySenti(RecordSearchDTO recordSearchDTO);

    /**
     * 查询原话记录的内容
     *
     * @param recordSearchDTO 查询条件
     * @return List<String>
     * @author jy.zhao
     * @date 2021/5/14 16:08
     **/
    List<String> listRecordContent(RecordSearchDTO recordSearchDTO);

    /**
     * 根据关键词查询原话记录的Id
     * 使用时注意 返回类型为{"_id": {"$oid": "60506b5e528324003c4bfa88"}}。
     * 为了性能，直接使用字符串接收，对结果不影响
     *
     * @param recordSearchDTO
     * @return List<String>
     * @author jy.zhao
     * @date 2021/5/14 16:08
     **/
    Set<String> listRecordIdByKeywords(RecordSearchDTO recordSearchDTO);


    /**
     * 根据关键词查询原话记录的数量
     *
     * @param recordSearchDTO
     * @return List<String>
     * @author jy.zhao
     * @date 2021/5/14 16:08
     **/
    Long countRecordByKeyword(RecordSearchDTO recordSearchDTO);

    /**
     * 根据项目id查找原话记录的最小时间
     *
     * @param projectId 项目id
     * @return LocalDateTime 找不到时返回null
     * @author jy.zhao
     * @date 2021/5/24 15:07
     **/
    LocalDateTime getMinRecordTimeByProject(String projectId);

    /**
     * 获取当前文本分析项目已有原话记录中的最大时间
     *
     * @param projectId projectId 项目id
     * @return 原话记录最大record_time
     * @author liheng
     * @date 2021/5/14 11:23
     */
    LocalDateTime getMaxTime(String projectId);

    /**
     * 分页查询原话记录
     *
     * @param pageRecordDTO 分页查询条件
     * @return 分页原话数据
     * @author liheng
     * @date 2021/6/4 18:06
     */
    PageDTO<RecordDO> pageRecord(PageRecordDTO pageRecordDTO);


    /**
     * 根据项目id获取一条原话记录
     *
     * @param projectId 项目id
     * @return 记录
     */
    RecordDO getRecordByProjectId(String projectId);


    /**
     * 删除分析项目下的全部话题
     *
     * @param projectId 项目id
     * @return The result of a delete operation
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/21 14:27
     */
    boolean deleteProjectAllRecord(String projectId);

    // ================== 异步训练用 ==================

    /**
     * 查询项目下所有原话的数量
     *
     * @param projectId 项目id
     * @return The number of all records in the project
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/6/28 16:42
     */
    long countProjectAllRecord(String projectId);

    /**
     * 查询项目对应字段下所有原话的数量
     *
     * @param projectId 项目id
     * @return The number of all records in the field
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/7/27
     */
    long countProjectFieldRecord(String projectId, String fieldId);

    /**
     * 查询项目对应字段原话记录的最大 collection_time
     *
     * @param projectId 项目id
     * @param fieldId   字段id
     * @return Field record max collection_time
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/21 18:23
     */
    String findMaxCollectionTime(String projectId, String fieldId);

    /**
     * 查询项目对应字段原话记录的最大 created_dt
     *
     * @param projectId 项目id
     * @param fieldId   字段id
     * @return Field record max created_dt
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/7/23 11:30
     */
    String findMaxCreatedDt(String projectId, String fieldId);


    /**
     *
     * @param oldProjectId
     * @return
     */
    List<RecordDO> listRecordByProjectId(String oldProjectId);

//    /**
//     * 查询项目对应字段原话记录的最大 collection_id
//     *
//     * @param projectId 项目id
//     * @param fieldId   字段id
//     * @return Field record max collection_id
//     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
//     * @date 2021/5/21 18:23
//     */
//    String findMaxCollectionId(String projectId, String fieldId);

}
